package com.vegetable.modules.service.finance;

import com.alibaba.fastjson.JSONObject;
import com.vegetable.modules.service.baseData.IFundAccountService;
import com.vegetable.modules.service.wx.WxCpMessageService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 财务分析定时任务
 * 定期将财务分析数据推送到企业微信管理员
 *
 * @author Qoder
 */
@Slf4j
@Component
public class FinancialAnalysisScheduledTask {

    @Autowired
    private IFundAccountService fundAccountService;

    @Autowired
    private WxCpMessageService wxCpMessageService;
    
    @Autowired
    private FinancialDataFormatter financialDataFormatter;
    
    @Autowired
    private FinancialAnalysisWxPushService financialAnalysisWxPushService;

    // 企业微信管理员用户ID，多个用户用|分隔
    @Value("${wechat.cp.admin.userIds:ZhangSan}")
    private String adminUserIds;

    /**
     * 每天上午9点执行财务分析数据推送（文本形式）
     */
    @Scheduled(cron = "0 0 9 * * ?")
    public void pushDailyFinancialAnalysis() {
        try {
            log.info("开始执行每日财务分析数据推送任务（文本形式）");
            
            // 获取近一个月的财务分析数据
            JSONObject financialData = getFinancialAnalysisData(1);
            
            if (financialData != null) {
                // 推送数据到企业微信管理员
                String[] userIds = adminUserIds.split("\\|");
                StringBuilder content = new StringBuilder();
                content.append("【每日财务分析报告】\n\n");
                content.append("数据统计时间范围：近1个月\n\n");
                content.append(financialDataFormatter.formatFinancialSummary(financialData));
                
                for (String userId : userIds) {
                    try {
                        wxCpMessageService.sendTextMessageToUser(userId.trim(), content.toString());
                        log.info("财务分析数据已推送到企业微信用户: {}", userId);
                    } catch (WxErrorException e) {
                        log.error("推送财务分析数据到企业微信用户失败: {}", userId, e);
                    }
                }
            } else {
                log.warn("获取财务分析数据失败");
            }
        } catch (Exception e) {
            log.error("执行每日财务分析数据推送任务时发生异常", e);
        }
    }

    /**
     * 每周一上午9点执行周财务分析数据推送（图文形式）
     */
    @Scheduled(cron = "0 0 9 * * MON")
    public void pushWeeklyFinancialAnalysisChart() {
        try {
            log.info("开始执行每周财务分析数据推送任务（图文形式）");
            
            // 获取近三个月的财务分析数据
            JSONObject financialData = getFinancialAnalysisData(3);
            
            if (financialData != null) {
                // 推送图表数据到企业微信管理员
                String[] userIds = adminUserIds.split("\\|");
                
                for (String userId : userIds) {
                    try {
                        boolean result = financialAnalysisWxPushService.pushFinancialAnalysisChartToWxUser(financialData, userId.trim());
                        if (result) {
                            log.info("财务分析图表数据已推送到企业微信用户: {}", userId);
                        } else {
                            log.error("推送财务分析图表数据到企业微信用户失败: {}", userId);
                        }
                    } catch (Exception e) {
                        log.error("推送财务分析图表数据到企业微信用户失败: {}", userId, e);
                    }
                }
            } else {
                log.warn("获取财务分析数据失败");
            }
        } catch (Exception e) {
            log.error("执行每周财务分析图表数据推送任务时发生异常", e);
        }
    }

    /**
     * 获取财务分析数据
     *
     * @param chartRange 时间范围（月）
     * @return 财务分析数据
     */
    private JSONObject getFinancialAnalysisData(Integer chartRange) {
        try {
            // 这里需要通过反射或其他方式调用financialAnalysis方法
            // 由于接口设计问题，我们直接调用服务方法
            return (JSONObject) fundAccountService.financialAnalysis(chartRange).getData();
        } catch (Exception e) {
            log.error("获取财务分析数据失败", e);
            return null;
        }
    }
}